package cn.xzq.crm.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;

public class BaseDaoImpl<T> implements BaseDao<T> {

	@Autowired
	protected HibernateTemplate hibernateTemplate;
	private Class clazz = null; 
	
	public BaseDaoImpl(){
		//1、得到当前运行类Class
		Class _class = this.getClass();
		//System.out.println("==========" + _class.getName());
		//2、得到运行类的父类的参数化类型----BaseDaoImpl<Customer>
		/*
		 * Type	 getGenericSuperclass() 获取父类的type
		 * 使用Type接口的ParameterizedType
		 */
		Type type = _class.getGenericSuperclass();
		//强转
		ParameterizedType ptype = (ParameterizedType)type;
		//3、得到实际参数化类型参数---<Customer>里的Customer
		/*
		 * Type[] getActualTypeArguments()
		 * 因为Type接口的实现类是Class,得到的结果直接就可以使用
		 */
		Type[] types = ptype.getActualTypeArguments();
		this.clazz = (Class) types[0];
	}
	
	@Override
	public void add(T t) {
		hibernateTemplate.save(t);		
	}

	@Override
	public void delete(T t) {
		hibernateTemplate.delete(t);
	}

	@Override
	public void update(T t) {
		hibernateTemplate.update(t);
	}
	
	//依赖反射、泛型得到对应的类名进行hql查询
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAll() { 
		return (List<T>) hibernateTemplate.find("from "+clazz.getSimpleName());
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findOneById(String id) {
		return (T) hibernateTemplate.get(clazz, id);
	}

}
